#ifndef ABSELEMENT_H
#define ABSELEMENT_H

#include <qmap.h>
#include <QObject>
#include <elementstytle.h>
class QString;
class HtmlElement;
class  AbsElement:public QObject,public ElementStytle
{
    Q_OBJECT
public:
    ///同 HTML 的标签属性：
    /// 块级元素：Div Table  Tr P H1 H2 H4 H4 Hr
    /// 行内块元素：Td Span
    /// 容器元素：Div
    /// 若元素出现了边框塌陷 问题 可以 将元素加入容器中 设置合适的长宽高（参照HTML 处理边框塌陷问题）
    //!

    AbsElement(QObject *prent);
    AbsElement(const AbsElement &absEle, QObject* prent );
    AbsElement& operator =(const AbsElement &absEle){
        QFont::operator =(absEle);
        QColor::operator =(absEle);
        this->m_nameStr = absEle.nameStr();
        this->m_attributeMap = absEle.attributeMap();
        this->m_styleSheet =absEle.styleSheet();
        return *this;
    }

    //interface
public:

    void forMate();
    QString nameStr() const;

    void setNameStr(const QString &nameStr);


    //接口函数
    /**
     * @brief setAttrbute 设置元素的 属性 参照 HTMl 各元素的 attrbute 规则
     * @param key  键
     * @param value 值
     *
    */
    void setAttrbute(QString key, QString value);
    /**
     * @brief appendElement  向元素内部增加 增加一个元素 （暂时没用）
     * @param ele
     */
    virtual void appendElement(AbsElement *ele);
    /**
     * @brief toString  将元素信息转化为 HTML片段的字符串
     * @return
     */
    virtual QString toString();
    /**
     * @brief attributeMap
     * @return
     */


    QMap<QString, QString> attributeMap() const;

    QMap<QString, QString> styleSheet() const;
    void setStyleSheet(const QMap<QString, QString> &styleSheet);
    void setStyleSheet(const QString key,const QString value);

    //!
    //! \brief setOutObj
    //! \param ele
    //!
    virtual void setOutObj(HtmlElement *ele) = 0;
    //!
    //! \brief getOutObj
    //! \return
    //!
    virtual HtmlElement *getOutObj() = 0;
protected:
    virtual void initMate() = 0 ;
    virtual QString context() =0;
    virtual void clear();

public:
    ///设置元素的 大小 只有块级元素（包括行内块） 才会生效
    virtual void setEleWidth(int width);
    virtual void setEleHeight(int heigth);
private:
    QString forMateStyle();
    void forMateStyleMap(QString &styleMap);
    QString forMateAttr();

private :
    /**
     * @brief m_nameStr
     * 元素名
     */
    QString m_nameStr;
    /**
     * @brief m_attributeMap
     * attribute 列表
     */
    QMap<QString,QString> m_attributeMap;
    /**
     * @brief m_styleSheet
     * 样式列表 只有 style 部分
     */
    QMap<QString,QString> m_styleSheet;
};

#endif // ABSELEMENT_H
